/*
将一个无符号10进制整数的二进制位打印出来。
思路：设这个数为A，
步1：如果A不为0，记录A除以2的余数；否则进入步3；
步2：A = A/2;返回步1；
步3：将记录下来的余数倒序输出；
*/

#include <stdio.h>
#include<math.h>
//将一个数字反过来，低位变高位，高位变低位
unsigned long int reverseNumber(unsigned long int aNumber);
void toBin(unsigned int uNumber);
int main()
{
    for(int i=0;i<=1023;i++){
       toBin(i);
    }	
}

void toBin(unsigned int uNumber)
{
	// 注意参数不能太大，否则可能溢。不能超过1023
	unsigned int a;
	a = uNumber;
    int numOfZeros = 0;//记录在碰到1之前，前导有多少个0
    int needCount = 1;//是否需要记录前导的0
	unsigned long long int rst = 0;
	while (a != 0)
	{
        if ((a % 2 == 0) && (needCount == 1))
            numOfZeros++;
        else
            needCount = 0;
		//把余数记录下来
		rst = rst * 10 + (a % 2);
		a = a / 2;
	}
	//将数字反过来
	rst = reverseNumber(rst);
    rst = rst * (unsigned long long int)pow(10,numOfZeros);
    printf("%d对应二进制数为：%lld\n",uNumber, rst);
}

unsigned long int reverseNumber(unsigned long int aNumber)
{
	unsigned long int rst = 0;
	do
	{
		//取最后一位
		rst = rst * 10 + (aNumber % 10);
		aNumber = aNumber / 10;
	}
	while (aNumber != 0);
	return (rst);
}
